Skip to content

Restore Goose and Buzz Agent to onboarding harness selection#2731

Open
morgmart wants to merge 5 commits into
mainfrom
morgan/restore-onboarding-harnesses
Open

Restore Goose and Buzz Agent to onboarding harness selection#2731
morgmart wants to merge 5 commits into
mainfrom
morgan/restore-onboarding-harnesses

Conversation

@morgmart

@morgmart morgmart commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Note

Part 1 of a multi-PR onboarding rework. This PR only restores the hidden harnesses, adjusts the card layout, and gates onboarding completion on valid config. A follow-up PR (stacked on this branch) restructures the flow: the harness page becomes a single-choice "pick your default harness" step, and install/sign-in/provider setup moves to the following page. Review this one on its own terms — the flow rework is intentionally not here.

Summary

  • Restore Goose and Buzz Agent to onboarding harness selection, reverting the launch-only restriction from Hide bundled harnesses from onboarding #2233
  • The restore is the single centralized allowlist (ONBOARDING_RUNTIME_ORDER in onboardingRuntimeSelection.ts) that Hide bundled harnesses from onboarding #2233 deliberately set up for this moment — setup cards, readiness handoff, and the defaults harness picker all derive from it
  • Lay the four harness cards out as a single row at lg and above (lg:grid-cols-4); below 1024px (including the app's 800px minimum window width) the grid is 2×2, and 1-up on narrow viewports
  • Gate onboarding Finish on actual config validity (review finding): the defaults page rendered provider/model/credential fields for provider-required harnesses but Finish only checked that a harness was selected — a fresh user picking Buzz Agent could persist a default that fails at first spawn. The Finish gate now consumes AgentConfigFields' existing onValidityChange signal. Baked build env and runtime-file config satisfy the gate, so internal builds and existing Goose users are never blocked
  • Update the unit + E2E specs that pinned the hidden behavior, plus two new E2E cases pinning the Finish gate (blocked-until-configured, and baked-env never blocked)
  • AGENTS.md rule 7 updated to document the completion gate

Testing

  • onboardingRuntimeSelection.test.mjs — 4 passed
  • pnpm typecheck — clean
  • pnpm exec playwright test tests/e2e/onboarding-agent-defaults.spec.ts --project=smoke — 21 passed
  • onboarding-docked-cta-screenshots.spec.ts — 3 passed
  • Biome — clean

Known cosmetic issue (deferred to PR 2)

At the app's minimum window size (800×500) the 2×2 grid extends past the visible area and the footer CTA overlaps card space. Next still hit-tests correctly. PR 2 redesigns this page entirely (cards become a single-choice chooser with no inline setup), so this is deferred rather than patched twice.

morgmart added 3 commits July 23, 2026 17:08
Reverts the launch-only restriction from #2233 by adding goose and
buzz-agent back to ONBOARDING_RUNTIME_ORDER — the single centralized
onboarding visibility allowlist. Setup cards, readiness handoff, and
the defaults harness picker all follow from that one list.

Also generalizes the empty-state copy and updates the unit + E2E specs
that pinned the hidden behavior.
With Goose and Buzz Agent restored, the 2x2 grid read as two tiers.
A single lg:grid-cols-4 row (falling back to 2-up below lg and 1-up
on narrow viewports) presents the four harnesses as peers.
…ding-harnesses

* origin/main:
  ci: add Windows and Linux canary workflows with caching (#2642)
  fix(onboarding): show real install errors and fix concurrent install state (#2658)
  feat(node): add Windows managed Node.js fallback (win-x64 + win-arm64) (#2661)
  fix(desktop): parse runtime team instructions section (#2645)
  Match create-channel template selector styling (#2654)
  feat(desktop): make pull request reviews actionable (#2510)
  fix(desktop): shared-compute usability — share toggle, usage indicator, model resync (#2448)
  fix(desktop): refine focused thread dismissal targets (#2644)
  fix(relay): decompress gzip-encoded git smart-HTTP request bodies (#2670)
  Clarify agent harness defaults in create flow (#2601)
@morgmart
morgmart marked this pull request as ready for review July 25, 2026 00:26
@morgmart
morgmart requested a review from a team as a code owner July 25, 2026 00:26

@wpfleger96 wpfleger96 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reviewed this at 67bd81fed75507cd94fc1d1a828a14dc084617cb. I think the centralized allowlist change correctly restores Goose and Buzz Agent across setup, readiness handoff, and default selection, and the responsive four-card layout holds. I reran the desktop typecheck, checks, 3,483 helper/unit tests, production build, and the 21 targeted onboarding Playwright cases; all passed. No code findings from me.

This currently conflicts with main in SetupStep.tsx; rebase and preserve main's clarified command-line-harness copy when resolving.

@wpfleger96 wpfleger96 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Agent-authored review.

Independent review at 67bd81fed75507cd94fc1d1a828a14dc084617cb (isolated worktree, full-file context, plus targeted Playwright probes against the --mode e2e dist build served on 127.0.0.1:4173). The allowlist centralization itself is right: ONBOARDING_RUNTIME_ORDER stays the single source of truth and SetupStep.tsx, getReadyOnboardingRuntimes, and the default-harness picker all derive from it. Three notes, one of them functional.

IMPORTANT — onboarding can persist a global default that is NotReady at spawn time

Adding buzz-agent to the onboarding allowlist makes a pre-existing gap in DefaultConfigStep.tsx reachable for the first time. buzz-agent is bundled, so auth_status is not_applicable and runtimeIsReadyForOnboarding always counts it ready — which means it can be auto-selected as the only/first ready runtime on a machine with no CLI harnesses installed. But unlike claude/codex (acpNative, no provider/model requirements), buzz_agent_requirements on the Rust side demands BUZZ_AGENT_PROVIDER, a model, and provider credentials.

Measured with buzz-agent selected in onboarding:

  • provider control renders as "Select a provider", model option count = 1
  • the Finish button is enabled
  • persisted global config both before and after Finish: {"env_vars":{},"provider":null,"model":null,"preferred_runtime":"buzz-agent"}

Baseline with claude selected: Finish enabled, provider control count 0, preferred_runtime: "claude" — legitimately valid for a CLI-login harness. So the first-run flow now hands a brand-new user a default that fails at the very first spawn.

Cause: DefaultConfigStep.tsx:190 gates completion on only selectedRuntimeId.length > 0 && !isSaving. AgentConfigFields.tsx:354 already computes the richer configIsValid (selectedRuntimeId.length > 0 && modelIsValid && credentialsValid) and publishes it through the optional onValidityChange prop — which AgentDefaultsEditor.tsx:250 consumes but the onboarding instance does not. Minimal fix: wire onValidityChange into the onboarding AgentConfigFields and fold it into canComplete. No new validation logic needed.

MINOR — the responsive claim is 1 → 2 → 4 only above lg

Measured card geometry with 4 ready runtimes:

  • 800px, 900px, 1023px: 2 columns × 2 rows (cards at y=228 / y=468, w=288)
  • 1024px, 1100px, 1280px, 1440px: single row of 4 (y=326, w=236–248)

Since tauri.conf.json sets minWidth: 800, every window width from the app minimum up to 1023px renders a 2×2 grid, not one row. Fine as behavior — just worth not describing the change as a one-row layout.

MINOR — 2×2 grid clips at the app's minimum window size

At 800×500 (the configured minimum) the last card's bottom edge is at 692px while document.scrollHeight and clientHeight are both 500, so content extends past the scroll container, and the fixed footer CTA at y=346 overlaps card space. The Next button still hit-tests and reports visible at 800×500, 800×600, 1024×500, and 1280×800, so this is cosmetic rather than blocking — but going from 2 cards to 4 is what surfaced it.

Merge blocker (operational, not a code defect)

The branch conflicts with main in desktop/src/features/onboarding/ui/SetupStep.tsx. main's newer copy reads "Buzz checks for command-line harnesses on this machine…" and uses grid-cols-1 md:grid-cols-2 max-w-[592px]; the rebase should preserve main's wording while keeping this PR's lg:grid-cols-4 / max-w-[1200px] grid.

CI was green at this head (run 30111564476).

morgmart added 2 commits July 26, 2026 13:13
…ding-harnesses

* origin/main: (47 commits)
  fix(desktop): remove bundled libsystemd from AppImage (#2353)
  docs: document required DCO sign-off and add commit-msg sign-off hook (#2993)
  fix(desktop): make agent definition authoritative for model/provider/prompt (#1968)
  chore(desktop): delete dead persona catalog UI cluster (#2886)
  fix(desktop): surface install failures hidden by curl-pipe exit codes (#2892)
  fix(mobile): validate invite relay destinations (#2986)
  Refactor managed-agent runtime into cohesive modules (#2974)
  Refine mobile settings and themes (#2844)
  Fix formatting in README.md diagram (#2284)
  fix(desktop): make Linux AppImage GStreamer work on non-Debian distros (#2176)
  refactor(desktop): remove Agent directory section from Agents page (#2290)
  fix(desktop): enable arboard Wayland backend so Linux copies reach the Wayland clipboard (#2904)
  fix(desktop): supervise and re-arm relay-mesh runtime (#2823)
  fix(agents): run live Databricks discovery instead of the fallback list (#2890)
  fix(desktop): retire prepend mode on every reader wheel (#2913)
  fix(desktop): consolidate prepend scroll correction (#2855)
  docs(buzz-acp): correct agent key generation instructions (#2875)
  fix(desktop): track concurrent agent turns up to the harness maximum (#2882)
  docs(contributing): trim to goose-scale minimal intake surface (#2780)
  fix(relay): preserve reconnect backoff (#2759)
  ...

Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>

# Conflicts:
#	desktop/src/features/onboarding/ui/SetupStep.tsx
The defaults page rendered provider/model/credential fields for
provider-required harnesses (buzz-agent, goose) but Finish only checked
that a harness was selected — a fresh user could persist a default that
fails at first spawn. Wire AgentConfigFields' existing onValidityChange
signal into the completion gate.

Baked build env and runtime-file config satisfy the gate, so internal
builds and existing Goose users are never blocked. Pinned by two new
E2E cases; AGENTS.md rule 7 updated to document the gate.

Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
@morgmart

Copy link
Copy Markdown
Contributor Author

🤖 Agent-authored reply on Morgan's behalf.

All addressed at 5b51cb65f:

  • IMPORTANT (NotReady default persistable): Fixed as suggested — the onboarding AgentConfigFields instance now wires onValidityChange into the Finish gate (canComplete = harness selected && configIsValid && !isSaving). No new validation logic. Pinned by two new E2E cases: buzz-agent with no provider → Finish disabled until provider + credential are configured; baked build env (Databricks) → Finish enabled with no manual setup, so internal builds are never blocked. AGENTS.md rule 7 updated to document the gate.
  • Merge conflict: Resolved — main's "command-line harnesses" copy preserved verbatim (subheading + empty state), this PR's lg:grid-cols-4 / max-w-[1200px] grid kept.
  • Responsive claim: PR description corrected — single row at ≥1024px, 2×2 below (including the 800px minimum window width).
  • Min-window clipping at 800×500: Acknowledged, deferred deliberately. PR 2 in this stack replaces the setup page's card grid with a single-choice chooser (no inline install/sign-in), which removes the overflow rather than patching a layout that's about to be deleted. Noted in the PR body under "Known cosmetic issue."

Acceptance spec now at 21 passed; full pre-push gates green.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants